gdkglcontext-win32.c: Fix running with Mesa drivers
authorChun-wei Fan <fanchunwei@src.gnome.org>
Thu, 29 Apr 2021 04:04:42 +0000 (12:04 +0800)
committerChun-wei Fan <fanchunwei@src.gnome.org>
Thu, 29 Apr 2021 04:12:01 +0000 (12:12 +0800)
Some GL drivers such as Mesa-D3D12 do not allow one to call SetPixelFormat() on
a given HDC if one pixel format has been already set for it, so first check the
HDC with GetPixelFormat() to see whether a pixel format has already been set
with the HDC, and only attempt to acquire the pixel format if one has not been
set.

This will fix running with GL/NGL on Windows using the Mesa drivers.

gdk/win32/gdkglcontext-win32.c

index c7e7fa3345c62874981b2b36019c6bc02da87be0..610711d3b89d1594e67578d30a5e32a8fad32f63 100644 (file)
@@ -712,20 +712,30 @@ _set_pixformat_for_hdc (HDC              hdc,
                         int             *best_idx,
                         GdkWin32Display *display)
 {
-  PIXELFORMATDESCRIPTOR pfd;
-  gboolean set_pixel_format_result = FALSE;
+  gboolean already_checked = TRUE;
+  *best_idx = GetPixelFormat (hdc);
 
   /* one is only allowed to call SetPixelFormat(), and so ChoosePixelFormat()
    * one single time per window HDC
    */
-  *best_idx = _get_wgl_pfd (hdc, &pfd, display);
+  if (*best_idx == 0)
+    {
+      PIXELFORMATDESCRIPTOR pfd;
+      gboolean set_pixel_format_result = FALSE;
 
-  if (*best_idx != 0)
-    set_pixel_format_result = SetPixelFormat (hdc, *best_idx, &pfd);
+      GDK_NOTE (OPENGL, g_print ("requesting pixel format...\n"));
+         already_checked = FALSE;
+      *best_idx = _get_wgl_pfd (hdc, &pfd, display);
 
-  /* ChoosePixelFormat() or SetPixelFormat() failed, bail out */
-  if (*best_idx == 0 || !set_pixel_format_result)
-    return FALSE;
+      if (*best_idx != 0)
+        set_pixel_format_result = SetPixelFormat (hdc, *best_idx, &pfd);
+
+      /* ChoosePixelFormat() or SetPixelFormat() failed, bail out */
+      if (*best_idx == 0 || !set_pixel_format_result)
+        return FALSE;
+    }
+
+  GDK_NOTE (OPENGL, g_print ("%s""requested and set pixel format: %d\n", already_checked ? "already " : "", *best_idx));
 
   return TRUE;
 }